Android系统提供了访问系统应用程序的数据的功能,例如得到联系人信息等。本节内容详细叙述如何取得联系人信息。

在Android系统中,联系人应用程序为“Contacts”,中文名称为“通讯录”,该程序是一个ContentProvider,提供了供其它程序访问和操控的“界面”,方便其它程序使用,例如在自己的程序中调出手机上的联系人,然后给对方写邮件等。

Contacts应用程序数据库存放在什么地方呢?在DDMS中的“File Explorer”中可以看到存放的路径是\/data\/data\/com.android.provider.contacts\/databases\/contacts2.db。如图所见。

使用sqlite3.exe程序查看该数据库文件,可以发现数据库文件略微有些复杂,含有多个表,如下图所示。

我们要访问的联系人的数据就存放在这个数据库文件的各个表中。例如联系人id、联系人名称(display_name)、最后的通话时间、通话记录次数等信息就存放在contacts表中。幸好contacts程序提供了提供了用于管理联系人的Uri方便其它程序访问,下面给出几个常用的Uri:

  • ContactsContract.Contacts.CONTENT_URI:联系人

  • ContactsContract.CommonDataKinds.Phone.CONTENT_URI:电话,所指向的值其实是“content:\/\/ com.android.contacts\/data\/phones”,这个Uri会访问contacts表、 raw_contacts表和data表等。

  • ContactsContract.CommonDataKinds.Email.CONTENT_URI:邮件

7.4.2.1 联系人权限 要想访问联系人,必须设置读或写的权限。

<!--读取联系人权限-->
<uses-permission android:name="android.permission.READ_CONTACTS" />

<!--写入联系人权限-->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

7.4.2.2 联系人示例

该程序界面同样十分简单,界面有几个按钮,在此不给出具体布局,仅给出每个按钮的事件处理器。

//得到全部联系人
buttonAll.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) { 
        Cursor cursor=resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
        while(cursor.moveToNext()){
             String msg;
             //id
             String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
             msg="id:"+id;
             //name 
             String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
             msg=msg+" name:"+name;
             //phone
             Cursor phoneNumbers=resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                   ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"="+id,null,null);
             while(phoneNumbers.moveToNext()){
                  String  phoneNumber=phoneNumbers.getString(phoneNumbers.
                       getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                  msg=msg+" phone:"+phoneNumber; 
             }
             //email
             Cursor emails=resolver.query(ContactsContract.CommonDataKinds.Email.
                  CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID +"="+id,null,null); 
             while(emails.moveToNext()){
                  String email=emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                  msg=msg+" email:"+email;
             }
             Log.v(TAG,msg);
          }
    }
});

results matching ""

    No results matching ""